#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
配置管理器
用于加载和管理文本映射配置
"""

import json
import os
from typing import Dict, Any

class ConfigManager:
    """配置管理器类"""
    
    def __init__(self, config_dir: str = None):
        """
        初始化配置管理器
        
        Args:
            config_dir: 配置文件目录，默认为项目根目录下的config文件夹
        """
        if config_dir is None:
            # 获取项目根目录
            current_dir = os.path.dirname(os.path.abspath(__file__))
            project_root = os.path.dirname(current_dir)
            config_dir = os.path.join(project_root, "config")
        
        self.config_dir = config_dir
        self.mappings_file = os.path.join(config_dir, "text_mappings.json")
        self._mappings = None
        
    def _load_mappings(self) -> Dict[str, Any]:
        """
        加载映射配置
        
        Returns:
            映射配置字典
        """
        if self._mappings is None:
            # 确保配置文件存在
            self._ensure_config_file_exists()
            
            try:
                with open(self.mappings_file, 'r', encoding='utf-8') as f:
                    mappings = json.load(f)
                    
                # 确保所有必需的键都存在
                required_keys = ["chinese_to_english", "object_classes", "font_paths"]
                for key in required_keys:
                    if key not in mappings:
                        if key == "font_paths":
                            mappings[key] = []  # font_paths是数组
                        else:
                            mappings[key] = {}  # 其他是字典
                            
                self._mappings = mappings
                    
            except json.JSONDecodeError as e:
                print(f"⚠️ 配置文件格式错误: {e}")
                print("请检查JSON格式是否正确")
                # 返回空配置而不是硬编码默认值
                self._mappings = {
                    "chinese_to_english": {},
                    "object_classes": {},
                    "font_paths": []
                }
        
        return self._mappings
    
    def _ensure_config_file_exists(self):
        """
        确保配置文件存在，如果不存在则创建默认配置文件
        """
        if not os.path.exists(self.mappings_file):
            # 确保配置目录存在
            os.makedirs(os.path.dirname(self.mappings_file), exist_ok=True)
            
            # 创建默认配置文件（使用最小配置）
            default_config = {
                "chinese_to_english": {},
                "object_classes": {},
                "font_paths": []
            }
            
            with open(self.mappings_file, 'w', encoding='utf-8') as f:
                json.dump(default_config, f, ensure_ascii=False, indent=2)
            
            print(f"已创建默认配置文件: {self.mappings_file}")
            print("请根据需要编辑配置文件添加映射关系")
    
    def get_chinese_to_english_mapping(self) -> Dict[str, str]:
        """
        获取中文到英文的映射
        
        Returns:
            中文到英文映射字典
        """
        mappings = self._load_mappings()
        return mappings.get("chinese_to_english", {})
    

    
    def get_object_class_mapping(self) -> Dict[str, str]:
        """
        获取对象类别映射（英文到中文）
        
        Returns:
            对象类别映射字典
        """
        mappings = self._load_mappings()
        return mappings.get("object_classes", {})
    
    def get_font_paths(self) -> list:
        """
        获取字体路径列表
        
        Returns:
            字体路径列表
        """
        mappings = self._load_mappings()
        return mappings.get("font_paths", [])
    
    def get_chinese_class_name(self, english_class: str) -> str:
        """
        将英文类别名转换为中文
        
        Args:
            english_class: 英文类别名
            
        Returns:
            中文类别名，如果没有映射则返回原始英文名
        """
        object_mapping = self.get_object_class_mapping()
        return object_mapping.get(english_class, english_class)
    
    def convert_to_ascii(self, text: str) -> str:
        """
        将中文文本转换为ASCII文本（用于字体回退）
        
        Args:
            text: 原始文本
            
        Returns:
            转换后的ASCII文本
        """
        chinese_to_english = self.get_chinese_to_english_mapping()
        
        # 处理中文转换
        ascii_text = text
        for chinese, english in chinese_to_english.items():
            ascii_text = ascii_text.replace(chinese, english)
        
        return ascii_text
    
    def reload_config(self):
        """重新加载配置文件"""
        self._mappings = None
        self._load_mappings()

# 全局配置管理器实例
config_manager = ConfigManager()